﻿Public Class WysylkaDniaReportService

    Public Function GenerateReport(ByVal wysylkaDate As Date) As WysylkaDniaReport

        Dim unitOfWork As New UnitOfWork()
        Dim wysylkaRepository As New Repository(Of Entities.OEM.Wysylka)(unitOfWork)
        Dim dataWysylkiSpecification As New GeneralSpecifications.DateSpecification(Of Entities.OEM.Wysylka)(DateInputDialog.PickedDate)

        Dim wysylki As IList(Of Entities.OEM.Wysylka) = CType(wysylkaRepository.GetAllMatching(dataWysylkiSpecification), Global.System.Collections.Generic.IList(Of Global.WiremetModel.Entities.OEM.Wysylka))
        Dim wysylkiReportData As New List(Of WysylkaDniaReportDataRow)()


        If wysylki.Count = 0 Then
            Throw New Exception("Brak wysyłek w podanym dniu.")
        End If


        For Each wysylka As Entities.OEM.Wysylka In wysylki

            Dim reportDataRow As New WysylkaDniaReportDataRow()
            With reportDataRow
                .NumerWysylki = wysylka.Numer
                .NumerZlecenia = wysylka.Zlecenie.Numer
                .Klient = wysylka.Zlecenie.Klient.NazwaSkrocona
                .TerminWysylki = CDate(wysylka.Zlecenie.Termin.ToShortDateString())
                .StatusZlecenia = wysylka.Zlecenie.Status.Nazwa
                .StatusWysylki = wysylka.Zlecenie.StatusWysylki.Nazwa
                .Waga = CDec(wysylka.PaczkiWysylki.Select(Function(x) x.Waga).Sum())
                .LiczbaPaczek = CShort(wysylka.PaczkiWysylki.Count)
            End With
            wysylkiReportData.Add(reportDataRow)
        Next


        Dim wysylkaDniaReport As New WysylkaDniaReport()
        wysylkaDniaReport.SetDataSource(wysylkiReportData.OrderBy(Function(x) x.NumerWysylki))
        wysylkaDniaReport.SetParameterValue("p_wysylka_data", DateInputDialog.PickedDate.ToShortDateString())

        Return wysylkaDniaReport

    End Function

End Class
